import axios from 'axios'
import to from 'await-to-js'
import store from '@/store'
// import router from '@/router'
import { refreshTokenAPI } from '@/api/user'
import router from '../router'

const instance = axios.create({
  baseURL: 'http://101.35.25.8:8000/v1_0/',
  timeout: 10000
})

// 请求拦截 每一次网络请求都可以进行拦截。
instance.interceptors.request.use((config) => {
  // 假如有token 那么就加上token，如果没有token 那么就不加
  if (store.state.user.token) {
    config.headers.Authorization = 'Bearer ' + store.state.user.token
  }

  // 每一次请求都产生一个取消请求函数
  config.cancelToken = new axios.CancelToken((cancel) => {
    store.commit('user/pushCancelToken', {
      cancelToken: cancel
    })
  })
  return config
}, (err) => {
  return Promise.reject(err)
})

// 响应拦截。。。。
instance.interceptors.response.use((response) => {
  return response
}, async (err) => {
  // 401 鉴权失败
  // 双Token实现的机制。--- 无感刷新。
  if (err.response && err.response.status === 401) {
    // Token失效了？ 1.使用refreshTokenAPI这个函数进行刷新最新TOKEN 2.重新请求之前请求错误的接口
    const [err2, data] = await to(refreshTokenAPI())
    if (err2) {
      // 1. 有错误就说明refreshToken也失效了
      store.commit('user/setToken', '')
      store.commit('user/setRefreshToken', '')
      // 2. 进入登录页面
      router.push('/login')
    } else {
      // 一定要更新最新的Token
      store.commit('user/setToken', data.data.data.token)
      // 重新发送请求。
      return instance(err.config)
    }
  }

  // return Promise.reject(err)
})

export default ({ url, method = 'GET', params, data, headers }) => {
  const promise = to(instance({
    url,
    method,
    params,
    data,
    headers
  }))

  return promise
}
